#ifndef MATRIX_H
#define MATRIX_H
#include<bits/stdc++.h>
typedef long long int mat_t;
class matrix
{
    public:
        std::vector<mat_t> getval(mat_t x, mat_t y)const;//返回某行某列的值，若参数之一为0，则返回某行(列)的数组。若非法，返回空
        mat_t getm() const;//返回矩阵的行数
        mat_t getn() const;//返回矩阵的列数
        matrix  operator+(const matrix &b)const;//计算两矩阵的加法。若非法，返回空矩阵
        matrix& operator+=(const matrix& b);
        matrix& operator-=(const matrix& b);
        matrix& operator*=(mat_t b);
        bool operator==(const matrix &b)const;//判断两矩阵是否相等。
        bool operator!=(const matrix &b)const;//判断两矩阵是否不等
        bool operator^=(const matrix &b)const;//判断两矩阵是否同型(行列相等)
        void change_r_muti(mat_t x, double a);//进行对某行乘上一个数的初等行变换,若非法，不进行任何操作
        void change_r_change(mat_t x, mat_t y);//进行交换两行的初等行变换,若非法，不进行任何操作
        void change_r_add(mat_t x, mat_t y);//将行y加到行x上的初等行变换
        void change_c_muti(mat_t x, double a);  // 进行对某列乘上一个数的初等列变换,若非法，不进行任何操作
        void change_c_change(mat_t x, mat_t y); // 进行交换两列的初等列变换,若非法，不进行任何操作
        void change_c_add(mat_t x, mat_t y);    // 将列y加到列x上的初等列变换
        matrix operator*(mat_t b)const;//矩阵的数乘实现1
        friend matrix operator*(mat_t b,const matrix &a); // 矩阵的数乘实现2
        matrix operator-(const matrix &b)const;//矩阵的减法
        matrix operator-() const;//对矩阵求负
        matrix(mat_t m, mat_t n, mat_t* data);//构造函数,接受行数、列数和一个二位数组指针以进行构造
        matrix(){}//自动生成的构造函数
        matrix(mat_t m, mat_t n, mat_t val=0);//创建数值全部一致的矩阵。默认填充为0
        bool modify(mat_t x, mat_t y, mat_t val);//将矩阵第x、y的位置的值修改为val,成功返回1，否则返回0
        void resize(mat_t x,mat_t y);//修改矩阵大小为x行y列，保留原有数据。若修改后变大，原有数据保留在左上角；若修改后变小，截断取原有左上角数据
    private: 
    std::vector<std::vector<mat_t>> mat; // 存储矩阵本身
    mat_t m, n;//矩阵的行数、列数
};
matrix mat_error(0,0,nullptr);
//由基类继承的方阵类
class square : public matrix
{
public:
    // 构造函数
    using matrix::matrix;
    void transpose();//矩阵转置
    mat_t getval(); // 返回矩阵的行列式值
    mat_t getr();
    bool operator==(mat_t x);//方阵的行列式是否等于一个数
    bool operator!=(mat_t x);

private:
    mat_t R; // 矩阵的秩
    mat_t val;//矩阵的值
    void countr();   // 计算矩阵的秩,
    void countval(); // 计算矩阵的行列式。
}
#endif